#ifndef __THREAD_POOL_H
#define __THREAD_POOL_H

#include "ds/task_queue.h"
#include <pthread.h>

/**
 * @brief 线程池结构体
 * @callgraph
 *
 */
typedef struct pool_s
{
    pthread_t *thread_ids;   /**< 所有子线程id */
    int threads_num;         /**< 子线程的数量 */
    int active_threads;      /**< 活跃线程数 */
    TaskQueue_t *task_queue; /**< 任务队列 */
    pthread_mutex_t lock;    /**< 互斥锁，用于对线程池的操作进行加锁 */
    pthread_cond_t cond;     /**< 条件变量，用于进程间通信 */
    int shutdown;            /**< 线程池关闭标志 */
} ThreadPool_t;

/**
 * @brief 根据指定数量创建线程池
 *
 * @param thread_count 线程数量
 * @return ThreadPool_t* 返回线程池结构体，NULL 表示创建失败
 */
ThreadPool_t *createThreadPool(int thread_count);

/**
 * @brief 销毁线程池
 *
 * @param pool 线程池结构体
 */
void destroyThreadPool(ThreadPool_t *pool);

/**
 * @brief 向线程池提交新的任务
 * 传入函数指针和参数指针
 * @param pool 线程池结构体
 * @param function 函数指针
 * @param arg 参数指针
 */
void submitTask(ThreadPool_t *pool, void (*function)(void *), void *arg);

/**
 * @brief 子线程入口函数
 *  子线程工作函数内部只释放任务结构体，不释放其中对应的参数所申请的空间
 * @param args 固定格式参数
 * @return void* 固定返回 NULL
 */
void *threadWorker(void *args);

#endif /* __THREAD_POOL_H */